fn main() {
    println!("Vec 使用泛型  Vec<T>, 所有元素类型须相同!!!");

    let v = vec![1, 2, 3];
    println!("{:?}", v);

    let mut v = Vec::new();
    v.push(5); // 添加
    println!("{:?}", v);

    // 取值
    // let third = v[2]; 超范围,崩溃
    let five = &v[0];
    println!("{five}");

    let v = vec![1, 2, 3];
    match v.get(2) {
        Some(third) => println!("{third}"),
        None => println!("none"),
    }
    // 超范围不会崩溃
    match v.get(100) {
        Some(third) => println!("{third}"),
        None => println!("none"),
    }

    /*为什么第一个元素的引用会关心 vector 结尾的变化？不能这么做的原因是由于 vector 的工作方式：在 vector 的结尾增加新元素时，在没有足够空间将所有元素依次相邻存放的情况下，可能会要求分配新内存并将老的元素拷贝到新的空间中。这时，第一个元素的引用就指向了被释放的内存。借用规则阻止程序陷入这种状况 */
    let mut v = vec!['a', 'b', 'c'];
    let a = &v[0];
    println!("{}", a);

    v.push('d');
    println!("{:?}", v);
    // println!("{}", a); // 无此行时 v.push 会正常执行; 否则报: mutable borrow occurs here

    // 遍历
    for i in &v {
        // in v 或 in &v 均可
        println!("{}", i);
    }

    // mut 更新各个元素
    for i in &mut v {
        *i = 'E';
    }
    println!("{:?}", v);

    // 使用 enum 保存不同类型的值
    #[derive(Debug)]
    enum SpreadsheetCell {
        Int(i32),
        Float(f64),
        Text(String),
    }

    let row = vec![
        SpreadsheetCell::Int(3),
        SpreadsheetCell::Text(String::from("blue")),
        SpreadsheetCell::Float(10.12),
    ];
    println!("{:?}", row); // 给类型加上 #[derive(Debug)] 才能打印
}
